#include <iostream>
#include <string.h>
#include <cstdio>
#include <errno.h>
//#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();

    if (id == 0)
    {
        while(true)
        {
            printf("我是子进程, pid: %d\n", getpid());
            sleep(1);
        }
        
        exit(0);
    }

    while (true)
    {
        sleep(1);
        pid_t rid = waitpid(id, nullptr, WNOHANG);
        if (rid > 0)
        {
            printf("等待子进程%d成功\n", rid);
            break;
        }
        else if (rid < 0)
        {
            printf("等待子进程失败\n");
            break;
        }
        else
        {
            printf("子进程尚未退出，父进程做自己的事情\n");
            //做自己的事情
        }
    }

}










// int main()
// {
//     // int *p = nullptr;
//     // *p = 10;
//     // int a = 1/0;
//     while (true)
//     {
//         printf("i am a process, pid: %d\n", getpid());
//         sleep(1);
//     }
    
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id < 0)
//     {
//         printf("errno: %d, errstring: %s\n", errno, strerror(errno));
//     }
//     else if (id == 0)
//     {
//         int cnt = 5;
//         while(1)
//         {
//             printf("子进程运行, pid: %d\n", getpid());
//             //cnt--;
//             sleep(1);
//         }
        
//         exit(100);
//     }
//     else 
//     {
//         int status = 0;
//         //pid_t rid = wait(nullptr);
//         pid_t rid = waitpid(id, &status, 0);
//         if (rid > 0)
//         {
//             if (WIFEXITED(status))
//             {
//                 printf("等待子进程成功, rid: %d, exit code: %d\n", rid, WEXITSTATUS(status));
//             }
//             else
//             {
//                 printf("进程异常退出, exit signal: %d\n", WTERMSIG(status));
//                 //printf("进程异常退出, exit signal2: %d\n", status&0x7f);
//             }
//         }
//         else
//         {
//             perror("waitpid");
//         }
        
//         while(true)
//         {
//             printf("我是父进程, pid: %d\n", getpid());
//             sleep(1);
//         }
//     }
// }



// void func()
// {
//     std::cout << "hello world" <<std::endl;
//     _exit(50);
// }

// int main()
// {
//     printf("hello world");
//     sleep(2);
//     _exit(30);
    
//     return 0;
// }

// int main()
// {
//     for (int i = 0; i < 200; i++)
//     {
//         printf("code: %d, errstring: %s\n", i, strerror(i));
//     }
//     // printf("before: errno: %d, errstring: %s\n", errno, strerror(errno));

//     // FILE *fp = fopen("./log.txt", "r");
//     // if(fp == nullptr)
//     // {
//     //     printf("after: errno: %d, errstring: %s\n", errno, strerror(errno));
//     //     return errno;
//     // }

//     return 0;
// }

// #include <iostream>
//
// int main()
// {
//     std::cout << "hello world!" << std::endl;
//     return 2;
// }